package com.specter.mvc.model.service;

import java.io.Serializable;
import java.util.List;

import com.specter.mvc.model.Page;
import com.specter.mvc.model.Request;

/**
 * Note:基本服务类接口
 * 
 * @author Liang.Wang
 * @version 2010-11-23 下午03:00:43
 */
public interface BaseService {

	/**
	 * 插入新数据，entity会被赋值新主键
	 * 
	 * @param entity 赋值的实体
	 * @return 是否成功
	 */
	public <T> boolean insert(T entity);

	/**
	 * 批量插入，默认批量为30条
	 * 
	 * @param entities 批量赋值的实体
	 * @return 是否成功
	 */
	public <T> boolean insertBatch(List<T> entities);

	/**
	 * 插入或修改（根据ID是否为空），entity会被赋值新主键
	 * 
	 * @param entity 赋值的实体
	 * @return 是否成功
	 */
	public <T> boolean insertOrUpdate(T entity);

	/**
	 * 批量插入或修改（根据ID是否为空），批量长度为30
	 * 
	 * @param entities 批量赋值的实体
	 * @return 是否成功
	 */
	public <T> boolean insertOrUpdate(List<T> entities);

	/**
	 * 通过实体键值相等条件 删除
	 * 
	 * @param entity 赋值的实体
	 * @return 是否成功
	 */
	public <T> boolean delete(T entity);

	/**
	 * 通过ID删除
	 * 
	 * @param id 主键ID
	 * @return 是否成功
	 */
	public boolean deleteById(Class<?> clazz, Serializable id);

	/**
	 * 根据主键批量删除
	 * 
	 * @param ids 主键列表
	 * @return 是否成功
	 */
	public boolean deleteByIds(Class<?> clazz, List<? extends Serializable> ids);

	/**
	 * 通过ID 更新所有属性（含NULL值），ID不能为空
	 * 
	 * @param entity 赋值的实体
	 * @return 是否成功
	 */
	public <T> boolean updateById(T entity, boolean isBlank);

	/**
	 * 根据ID 批量更新（含NULL值），ID不能为空
	 * 
	 * @param entities 批量赋值的实体
	 * @return 是否成功
	 */
	public <T> boolean updateById(List<T> entities, boolean isBlank);

	/**
	 * 根据 相等属性 查询单个对象（非唯一会报错）
	 * 
	 * @param entity 赋值的实体
	 * @return 单个对象
	 */
	public <T> T selectOne(T entity);

	/**
	 * 根据 ID 查询
	 * 
	 * @param id 主键ID
	 * @return 单个实体
	 */
	public <T> T selectOne(Class<T> clazz, Serializable id);

	/**
	 * 根据 相等属性 查询列表对象
	 * 
	 * @param entity 赋值的实体
	 * @param orders 排序字段，构建 orders_（已提供构建的工具类）
	 * @return 查询的列表
	 */
	public <T> List<T> select(T entity, Object orders);

	/**
	 * 查询（根据 列的映射条件）列表
	 * 
	 * @param params 列条件map映射 可以为null
	 * @param orders 排序字段以(propertyName,ASC/DESC)的方式整理排序，可以为null
	 * @return 查询的列表
	 */
	public <T> List<T> select(Class<T> clazz, Object params, Object orders);

	/**
	 * 查询（根据ID批量查询）
	 * 
	 * @param ids    批量主键
	 * @param orders 排序字段以(propertyName,ASC/DESC)的方式整理排序，可以为null
	 * @return 结果列表
	 */
	public <T> List<T> selectByIds(Class<T> clazz, List<? extends Serializable> ids, Object orders);

	/**
	 * 按照属性的相等条件 '=' 翻页查询
	 * 
	 * @param clazz   对应表
	 * @param request 条件关系
	 * @return 分页对象
	 */
	public <T> Page<T> selectPage(Class<T> clazz, Request request);

}
